/*
 * CavaID3jaudio.java
 *
 * Created on 28 aprile 2007, 15.30
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package alecava;

import java.io.*;
import org.jaudiotagger.audio.mp3.*;
import org.jaudiotagger.tag.*;
import org.jaudiotagger.tag.id3.*;
import org.jaudiotagger.tag.id3.valuepair.TextEncoding;
import org.jaudiotagger.tag.id3.framebody.*;
/**
 *
 * @author alecava
 */
public class CavaID3jaudio extends AbstractCavaID3 {
    private MP3File mp3;
    private AbstractID3v2Tag tag = null;
    private String titolo, artista, album, commento, anno, traccia, genere;
    /** Creates a new instance of CavaID3jaudio */
    public CavaID3jaudio(File f) throws IOException {
        super(f);
        f.setWritable(true);
        try {
            mp3 = new MP3File(f);
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
        caricaTag();
    }
    
    private void caricaTag(){
        if (this.mp3.hasID3v2Tag()){
            tag = mp3.getID3v2TagAsv24();
            //assegna i campi con i tag
            titolo = getTag("TIT2");
            traccia = getTag("TRCK");
            artista = getTag("TPE1");
            album = getTag("TALB");
            genere = getTag("TCON");
            commento = getTag("COMM");
            anno = getTag("TDRC");
        }
    }
    
    private String getTag(String frameId){
        if (tag.hasFrameAndBody(frameId)){
            Object o = tag.getFrame(frameId);
            if (o instanceof AbstractID3v2Frame){
                return parseText(((AbstractID3v2Frame) tag.getFrame(frameId)).getBody().getBriefDescription());
            }
        }
        return "";
    }
    /*parserizza i tag in forma ...Text="iamthetag";...*/
    private String parseText(String text){
        boolean trovato = false;
        StreamTokenizer stk = new StreamTokenizer(new StringReader(text));
        //così quando in ttype c'è " in sval c'è la stringa tra le virgolette
        stk.quoteChar('"');
        try {
            while (stk.nextToken() != StreamTokenizer.TT_EOF){
                switch(stk.ttype){
                    case StreamTokenizer.TT_WORD:
                        if (stk.sval.equals("Text")){
                            trovato = true;
                        }
                        break;
                    case '"':
                        if (trovato)
                            return stk.sval != null ? stk.sval.trim() : "";
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            return "";
        }
        //se arriva qua il tag non ha l'informazione che ci interessa
        return "";
    }
    
    @Override
    public boolean hasTag(){
        return this.tag != null;
    }
    
    @Override
    public String getAlbum(){
        return album;
    }
    
    @Override
    public String getTitle(){
        return titolo;
    }
    
    @Override
    public String getComment(){
        return commento;
    }
    
    @Override
    public String getArtist(){
        return artista;
    }
    
    @Override
    public String getTrack(){
        return traccia;
    }
    
    @Override
    public String getYear(){
        return anno;
    }
    
    @Override
    public String getGenre(){
        return genere;
    }
    
    @Override
    public void writeTag(String artista, String titolo, String album, String commento, String anno, String genere, String traccia) throws IOException {
        /*if (artista == null || titolo == null || album == null || commento == null
                || anno == null || genere == null || traccia == null) throw new NullPointerException();*/
        
        if (this.tag == null)
            this.tag = new ID3v24Tag();
        /*construisce i frame e i relativi body e li inserisce nel tag
         se il campo è significativo lo inserisce senò toglie il frame dal tag*/
        if (titolo != null && !titolo.equals("")){
            AbstractID3v2Frame frameTIT = new ID3v24Frame("TIT2");
            AbstractTagFrameBody bodyTIT = new FrameBodyTIT2(new Byte(TextEncoding.ISO_8859_1), titolo);
            frameTIT.setBody(bodyTIT);
            tag.setFrame(frameTIT);
        } else {
            if (tag.hasFrame("TIT2"))
                tag.removeFrame("TIT2");
        }
        
        if (traccia != null && !traccia.equals("")){
            AbstractID3v2Frame frameTRC = new ID3v24Frame("TRCK");
            AbstractTagFrameBody bodyTRC = new FrameBodyTRCK(new Byte(TextEncoding.ISO_8859_1), traccia);
            frameTRC.setBody(bodyTRC);
            tag.setFrame(frameTRC);
        } else {
            if (tag.hasFrame("TRCK"))
                tag.removeFrame("TRCK");
        }
        
        if (artista != null && !artista.equals("")){
            AbstractID3v2Frame frameTPE = new ID3v24Frame("TPE1");
            AbstractTagFrameBody bodyTPE = new FrameBodyTPE1(new Byte(TextEncoding.ISO_8859_1), artista);
            frameTPE.setBody(bodyTPE);
            tag.setFrame(frameTPE);
        } else {
            if (tag.hasFrame("TPE1"))
                tag.removeFrame("TPE1");
        }
        
        if (album != null && !album.equals("")){
            AbstractID3v2Frame frameALB = new ID3v24Frame("TALB");
            AbstractTagFrameBody bodyALB = new FrameBodyTALB(new Byte(TextEncoding.ISO_8859_1), album);
            frameALB.setBody(bodyALB);
            tag.setFrame(frameALB);
        } else {
            if (tag.hasFrame("TALB"))
                tag.removeFrame("TALB");
        }
        
        if (genere != null && !genere.equals("")){
            AbstractID3v2Frame frameTCO = new ID3v24Frame("TCON");
            AbstractTagFrameBody bodyTCO = new FrameBodyTCON(new Byte(TextEncoding.ISO_8859_1), genere);
            frameTCO.setBody(bodyTCO);
            tag.setFrame(frameTCO);
        } else {
            if (tag.hasFrame("TCON"))
                tag.removeFrame("TCON");
        }
        
        if (commento != null && !commento.equals("")){
            AbstractID3v2Frame frameCOM = new ID3v24Frame("COMM");
            AbstractTagFrameBody bodyCOM = new FrameBodyCOMM(new Byte(TextEncoding.ISO_8859_1),"eng","", commento);
            frameCOM.setBody(bodyCOM);
            tag.setFrame(frameCOM);
        } else {
            if (tag.hasFrame("COMM"))
                tag.removeFrame("COMM");
        }
        
        if (anno != null && !anno.equals("")){
            AbstractID3v2Frame frameTDR = new ID3v24Frame("TDRC");
            AbstractTagFrameBody bodyTDR = new FrameBodyTDRC(new Byte(TextEncoding.ISO_8859_1), anno);
            frameTDR.setBody(bodyTDR);
            tag.setFrame(frameTDR);
        } else {
            if (tag.hasFrame("TDRC"))
                tag.removeFrame("TDRC");
        }
        //setta
        mp3.setID3v2Tag(tag);
        //prova a scrivere
        try {
            mp3.save();
        } catch (TagException ex) {
            throw new IOException(ex.getMessage());
        }
        /*aggiorna i campi dell'oggetto*/
        this.artista = artista == null ? "" : artista;
        this.album = album == null ? "" : album;
        this.titolo = titolo == null ? "" : titolo;
        this.commento = commento == null ? "" : commento;
        this.anno = anno == null ? "" : anno;
        this.traccia = traccia == null ? "" : traccia;
        this.genere = genere == null ? "" : genere;
        /***************************/
    }
    
}
